import axios from 'axios';
import { ErrorHandler } from '@/middlewares/error.middleware';

// 钉钉API配置
const DINGTALK_API_BASE = 'https://oapi.dingtalk.com';

// 钉钉应用配置（需要从环境变量或配置文件中获取）
const DINGTALK_APP_KEY = 'dingus9vqk2ot7zlgmbn'//process.env.DINGTALK_APP_KEY || '';
const DINGTALK_APP_SECRET = 'mh3mnthagACOFhdFmy69Bd-abep2ZpLg6SjqPCOl9mSx2SyQc-TocctazhkGIlRR'//process.env.DINGTALK_APP_SECRET || '';

/**
 * 钉钉用户信息接口
 * 包含用户的基本信息、部门信息、权限信息等
 */
export interface DingTalkUserInfo {
  /** 用户ID，钉钉系统中的唯一标识 */
  userid: string;
  /** 用户姓名 */
  name: string;
  /** 手机号码 */
  mobile?: string;
  /** 邮箱地址 */
  email?: string;
  /** 头像URL */
  avatar?: string;
  /** 工号 */
  jobnumber?: string;
  /** 职位/职称 */
  title?: string;
  /** 工作地点 */
  work_place?: string;
  /** 备注信息 */
  remark?: string;
  /** 部门ID列表 */
  dept_id_list?: number[];
  /** 是否为部门领导，数组索引对应dept_id_list */
  leader_in_dept?: number[];
  /** 钉钉开放平台unionid */
  unionid?: string;
  /** 是否为专属账号 */
  exclusive_account?: boolean;
  /** 登录邮箱 */
  login_email?: string;
  /** 国家地区代码 */
  state_code?: string;
  /** 直属主管用户ID */
  manager_userid?: string;
  /** 座机号码 */
  telephone?: string;
  /** 企业邮箱 */
  org_email?: string;
  /** 是否隐藏手机号码 */
  hide_mobile?: boolean;
  /** 是否为高管 */
  senior?: boolean;
  /** 是否为管理员 */
  admin?: boolean;
  /** 是否为老板 */
  boss?: boolean;
  /** 是否激活 */
  active?: boolean;
  /** 是否实名认证 */
  real_authed?: boolean;
  /** 是否为真实管理员 */
  real_admin?: boolean;
  /** 部门排序信息 */
  dept_order_list?: Array<{
    /** 部门ID */
    dept_id: number;
    /** 排序值 */
    order: number;
  }>;
  /** 入职时间戳（毫秒） */
  hired_date?: number;
  /** 工号（新版本字段） */
  job_number?: string;
}

/**
 * 钉钉访问令牌响应接口
 * 用于获取钉钉API访问令牌的响应数据结构
 */
export interface DingTalkAccessTokenResponse {
  /** 错误码，0表示成功 */
  errcode: number;
  /** 错误信息 */
  errmsg: string;
  /** 访问令牌 */
  access_token: string;
  /** 令牌过期时间（秒） */
  expires_in: number;
}

/**
 * 钉钉用户信息响应接口
 * 钉钉API返回的用户信息响应数据结构
 */
export interface DingTalkUserInfoResponse {
  /** 错误码，0表示成功 */
  errcode: number;
  /** 错误信息 */
  errmsg: string;
  /** 用户ID，钉钉系统中的唯一标识 */
  userid: string;
  /** 用户姓名 */
  name: string;
  /** 手机号码 */
  mobile?: string;
  /** 邮箱地址 */
  email?: string;
  /** 头像URL */
  avatar?: string;
  /** 工号 */
  jobnumber?: string;
  /** 职位/职称 */
  title?: string;
  /** 工作地点 */
  work_place?: string;
  /** 备注信息 */
  remark?: string;
  /** 部门ID列表 */
  dept_id_list?: number[];
  /** 是否为部门领导，数组索引对应dept_id_list */
  leader_in_dept?: number[];
  /** 钉钉开放平台unionid */
  unionid?: string;
  /** 是否为专属账号 */
  exclusive_account?: boolean;
  /** 登录邮箱 */
  login_email?: string;
  /** 国家地区代码 */
  state_code?: string;
  /** 直属主管用户ID */
  manager_userid?: string;
  /** 座机号码 */
  telephone?: string;
  /** 企业邮箱 */
  org_email?: string;
  /** 是否隐藏手机号码 */
  hide_mobile?: boolean;
  /** 是否为高管 */
  senior?: boolean;
  /** 是否为管理员 */
  admin?: boolean;
  /** 是否为老板 */
  boss?: boolean;
  /** 是否激活 */
  active?: boolean;
  /** 是否实名认证 */
  real_authed?: boolean;
  /** 是否为真实管理员 */
  real_admin?: boolean;
  /** 部门排序信息 */
  dept_order_list?: Array<{
    /** 部门ID */
    dept_id: number;
    /** 排序值 */
    order: number;
  }>;
  /** 入职时间戳（毫秒） */
  hired_date?: number;
  /** 工号（新版本字段） */
  job_number?: string;
}

/**
 * 获取钉钉访问令牌
 * @returns 访问令牌
 */
export const getDingTalkAccessToken = async (): Promise<string> => {
  try {
    if (!DINGTALK_APP_KEY || !DINGTALK_APP_SECRET) {
      throw new ErrorHandler('钉钉应用配置缺失', 500);
    }

    const response = await axios.get<DingTalkAccessTokenResponse>(
      `${DINGTALK_API_BASE}/gettoken`,
      {
        params: {
          appkey: DINGTALK_APP_KEY,
          appsecret: DINGTALK_APP_SECRET,
        },
      }
    );

    if (response.data.errcode !== 0) {
      throw new ErrorHandler(`获取钉钉访问令牌失败: ${response.data.errmsg}`, 500);
    }

    return response.data.access_token;
  } catch (error) {
    if (error instanceof ErrorHandler) {
      throw error;
    }
    throw new ErrorHandler('获取钉钉访问令牌时发生错误', 500);
  }
};

/**
 * 通过code获取用户信息
 * @param code 钉钉授权码
 * @returns 用户信息
 */
export const getUserInfoByCode = async (code: string): Promise<DingTalkUserInfo> => {
  try {
    if (!code) {
      throw new ErrorHandler('授权码不能为空', 400);
    }

    // 获取访问令牌
    const accessToken = await getDingTalkAccessToken();

    // 调用钉钉API获取用户信息
    const response = await axios.post<DingTalkUserInfoResponse>(
      `${DINGTALK_API_BASE}/topapi/v2/user/getuserinfo`,
      {
        code: code,
      },
      {
        params: {
          access_token: accessToken,
        },
      }
    );

    if (response.data.errcode !== 0) {
      throw new ErrorHandler(`获取用户信息失败: ${response.data.errmsg}`, 500);
    }

    return {
      userid: response.data.userid,
      name: response.data.name,
      mobile: response.data.mobile,
      email: response.data.email,
      avatar: response.data.avatar,
      jobnumber: response.data.jobnumber,
      title: response.data.title,
      work_place: response.data.work_place,
      remark: response.data.remark,
      dept_id_list: response.data.dept_id_list,
      leader_in_dept: response.data.leader_in_dept,
      unionid: response.data.unionid,
      exclusive_account: response.data.exclusive_account,
      login_email: response.data.login_email,
      state_code: response.data.state_code,
      manager_userid: response.data.manager_userid,
      telephone: response.data.telephone,
      org_email: response.data.org_email,
      hide_mobile: response.data.hide_mobile,
      senior: response.data.senior,
      admin: response.data.admin,
      boss: response.data.boss,
      active: response.data.active,
      real_authed: response.data.real_authed,
      real_admin: response.data.real_admin,
      dept_order_list: response.data.dept_order_list,
      hired_date: response.data.hired_date,
      job_number: response.data.job_number,
    };
  } catch (error) {
    if (error instanceof ErrorHandler) {
      throw error;
    }
    throw new ErrorHandler('获取用户信息时发生错误', 500);
  }
};

/**
 * 通过用户ID获取用户详细信息
 * @param userid 用户ID
 * @returns 用户详细信息
 */
export const getUserInfoByUserid = async (userid: string): Promise<DingTalkUserInfo> => {
  try {
    if (!userid) {
      throw new ErrorHandler('用户ID不能为空', 400);
    }

    // 获取访问令牌
    const accessToken = await getDingTalkAccessToken();

    // 调用钉钉API获取用户详细信息
    const response = await axios.get<DingTalkUserInfoResponse>(
      `${DINGTALK_API_BASE}/topapi/v2/user/get`,
      {
        params: {
          access_token: accessToken,
          userid: userid,
        },
      }
    );

    if (response.data.errcode !== 0) {
      throw new ErrorHandler(`获取用户详细信息失败: ${response.data.errmsg}`, 500);
    }

    return {
      userid: response.data.userid,
      name: response.data.name,
      mobile: response.data.mobile,
      email: response.data.email,
      avatar: response.data.avatar,
      jobnumber: response.data.jobnumber,
      title: response.data.title,
      work_place: response.data.work_place,
      remark: response.data.remark,
      dept_id_list: response.data.dept_id_list,
      leader_in_dept: response.data.leader_in_dept,
      unionid: response.data.unionid,
      exclusive_account: response.data.exclusive_account,
      login_email: response.data.login_email,
      state_code: response.data.state_code,
      manager_userid: response.data.manager_userid,
      telephone: response.data.telephone,
      org_email: response.data.org_email,
      hide_mobile: response.data.hide_mobile,
      senior: response.data.senior,
      admin: response.data.admin,
      boss: response.data.boss,
      active: response.data.active,
      real_authed: response.data.real_authed,
      real_admin: response.data.real_admin,
      dept_order_list: response.data.dept_order_list,
      hired_date: response.data.hired_date,
      job_number: response.data.job_number,
    };
  } catch (error) {
    if (error instanceof ErrorHandler) {
      throw error;
    }
    throw new ErrorHandler('获取用户详细信息时发生错误', 500);
  }
}; 